 /*******************************************************************************
  * Copyright (c) 2004, 2005 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
  * Contributors:
  * IBM Corporation - initial API and implementation
  *******************************************************************************/
 package org.eclipse.ui.internal.intro.impl.util;

 import java.net.MalformedURLException ;
 import java.net.URL ;

 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.osgi.util.NLS;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.widgets.Control;
 import org.eclipse.swt.widgets.Display;
 import org.eclipse.swt.widgets.Event;
 import org.eclipse.swt.widgets.Listener;
 import org.eclipse.swt.widgets.Shell;
 import org.eclipse.ui.PartInitException;
 import org.eclipse.ui.PlatformUI;
 import org.eclipse.ui.browser.IWorkbenchBrowserSupport;

 public class Util {



     /**
      * Handle the exception by logging to the Log. <br>
      * Variables are subsituted in the message.
      */
     public static void handleException(String msg, Exception e,
             Object [] variables) {
         if (msg == null)
             return;
         if (variables != null) {
             // if variables is not null, errorId will never be null.
 msg = NLS.bind(msg, variables);
         }
         Log.error(msg, e);
     }

     /**
      * Handle the exception by displaying an Error Dialog. <br>
      * Also, the error is logged by the Log.
      */
     public static void handleExceptionWithPopUp(Shell parent, String msg,
             Exception e) {
         // if it is a core exception, use ErrorDialog. If the error id is null
 // this translates to giving null to this dialog which is handled by
 // Eclipse by displaying the detyailed message directly.
 if (e instanceof CoreException) {
             if (parent == null)
                 parent = DialogUtil.getActiveShell();
             DialogUtil.displayCoreErrorDialog(parent, msg, (CoreException) e);

             return;
         }

         // any other exception, use MessageDialog.
 // if errorID is null, use error message.
 if (msg == null)
             msg = e.getMessage();
         if (parent == null)
             parent = DialogUtil.getActiveShell();
         DialogUtil.displayErrorMessage(parent, msg, e);
     }

     /**
      * Utility method that will add a debug listener to the given control. All
      * common events are added.
      *
      * @param control
      * @return
      */
     public static Listener addDebugListener(Control control) {
         Listener listener = new Listener() {

             public void handleEvent(Event e) {
                 switch (e.type) {
                 case SWT.Selection:
                     System.out.println("Selection EVENT: " + e.toString()); //$NON-NLS-1$
 break;
                 case SWT.Dispose:
                     System.out.println("Dispose EVENT: " + e.toString()); //$NON-NLS-1$
 break;
                 case SWT.Paint:
                     System.out.println("Paint EVENT: " + e.toString()); //$NON-NLS-1$
 break;
                 case SWT.Resize:
                     System.out.println("Resize EVENT: " + e.toString()); //$NON-NLS-1$
 break;
                 case SWT.MouseDoubleClick:
                     System.out.println("MouseDoubleClick EVENT: " //$NON-NLS-1$
 + e.toString());
                     break;
                 case SWT.MouseDown:
                     System.out.println("MouseDown EVENT: " + e.toString()); //$NON-NLS-1$
 break;
                 case SWT.MouseUp:
                     System.out.println("MouseUp EVENT: " + e.toString()); //$NON-NLS-1$
 break;
                 case SWT.MouseMove:
                     System.out.println("MouseMove EVENT: " + e.toString()); //$NON-NLS-1$
 break;
                 case SWT.MouseEnter:
                     System.out.println("MouseEnter EVENT: " + e.toString()); //$NON-NLS-1$
 break;
                 case SWT.MouseExit:
                     System.out.println("MouseExit EVENT: " + e.toString()); //$NON-NLS-1$
 break;
                 case SWT.MouseHover:
                     System.out.println("MouseHover EVENT: " + e.toString()); //$NON-NLS-1$
 break;
                 case SWT.FocusIn:
                     System.out.println("FocusIn EVENT: " + e.toString()); //$NON-NLS-1$
 break;
                 case SWT.FocusOut:
                     System.out.println("FocusOut EVENT: " + e.toString()); //$NON-NLS-1$
 break;
                 case SWT.KeyDown:
                     System.out.println("KeyDown EVENT: " + e.toString()); //$NON-NLS-1$
 break;
                 case SWT.KeyUp:
                     System.out.println("KeyUp EVENT: " + e.toString()); //$NON-NLS-1$
 break;
                 case SWT.Traverse:
                     System.out.println("Traverse EVENT: " + e.toString()); //$NON-NLS-1$
 break;
                 case SWT.Show:
                     System.out.println("Show EVENT: " + e.toString()); //$NON-NLS-1$
 break;
                 case SWT.Hide:
                     System.out.println("Hide EVENT: " + e.toString()); //$NON-NLS-1$
 break;
                 default:
                     System.out.println(e.toString());
                 }
             }
         };
         int[] allEvents = new int[] { SWT.Selection, SWT.Dispose, SWT.Paint,
                 SWT.Resize, SWT.MouseDoubleClick, SWT.MouseDown, SWT.MouseUp,
                 // SWT.MouseMove,
 SWT.MouseEnter, SWT.MouseExit, SWT.MouseHover, SWT.FocusIn,
                 SWT.FocusOut, SWT.KeyDown, SWT.KeyUp, SWT.Traverse, SWT.Show,
                 SWT.Hide };
         for (int i = 0; i < allEvents.length; i++) {
             control.addListener(allEvents[i], listener);
         }
         return listener;
     }

     public static void sleep(int delay) {
         try {
             Thread.sleep(delay);
         } catch (InterruptedException e) {
             // no-op
 }
     }

     public static void highlight(Control control, int color) {
         control.setBackground(control.getDisplay().getSystemColor(color));
     }

     public static void highlightFocusControl() {
         Control control = Display.getCurrent().getFocusControl();
         if (control != null)
             control.setBackground(Display.getCurrent().getSystemColor(
                 SWT.COLOR_DARK_RED));
     }

     /**
      * Launch an external brwoser on the given url.
      */
     public static boolean openBrowser(String href) {
         try {
             URL url = new URL (href);
             IWorkbenchBrowserSupport support = PlatformUI.getWorkbench()
                 .getBrowserSupport();
             support.getExternalBrowser().openURL(url);
             return true;
         } catch (PartInitException e) {
             Log.error("Intro failed to get Browser support.", e); //$NON-NLS-1$
 return false;
         } catch (MalformedURLException e) {
             Log.error("Intro failed to display: " + href, e); //$NON-NLS-1$
 return false;
         }
     }

     public static void logPerformanceTime(String message, long startTime) {
         long endTime = System.currentTimeMillis();
         Log.forcedInfo("Intro Performance - " + message + (endTime - startTime) //$NON-NLS-1$
 + "ms"); //$NON-NLS-1$
 }

     public static void logPerformanceMessage(String message, long time) {
         Log.forcedInfo("Intro Performance - " + message + " " + time + "ms"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
 }

 }

